
from datetime import datetime
# Mapped 类型注解(type annotation)，用于在声明式模型(Declarative Models)中标注属性类型
# mapped_column: 替代旧版的Column，用于定义模型类的列属性，提供更简洁的语法和更好的类型提示支持
from sqlalchemy.orm import Mapped, mapped_column
from core.database import Base
# func 用于生成 SQL 函数的调用，如 func.now() 会生成 NOW() SQL 函数 count(), sum(), max() 
# inspect 提供对 SQLAlchemy 对象的运行时检查功能,检查模型实例的状态, 获取映射信息、属性状态等
from sqlalchemy import DateTime, Integer, func, Boolean, inspect


# class BaseModel(Base):

#     __abstract__ = True

#     id: Mapped[int] = mapped_column(Integer, primary_key=True, comment="主键ID")
#     create_time: Mapped[datetime] = mapped_column(DateTime, server_default=func.now(), comment="创建时间")
#     modify_time: Mapped[datetime] = mapped_column(DateTime, server_default=func.now(), onupdate=func.now(), comment="修改时间")
#     datastatus: Mapped[int] = mapped_column(Integer, default=1, comment="数据状态:1-新增;2-修改;3-删除")

#     @classmethod
#     def get_column_attrs(cls) -> list:
#         mapper = inspect(cls)
#         return mapper.column_attrs.keys()
    
#     @classmethod
#     def get_attrs(cls) ->list:
#         mapper = inspect(cls)
#         return mapper.attrs.keys()
    
#     @classmethod
#     def get_relationships_attrs(cls) -> list:
#         mapper = inspect(cls)
#         return mapper.relationships.keys()


class BaseModel(Base):
    """
    基础模型类，所有数据模型的基类
    采用SQLAlchemy 2.0风格的声明式模型定义
    提供公共字段和常用方法
    """
    
    # 声明这是一个抽象基类，SQLAlchemy不会为它创建表
    __abstract__ = True

    # 主键ID字段，使用Integer类型，作为主键
    id: Mapped[int] = mapped_column(Integer, primary_key=True, comment="主键ID")
    
    # 创建时间字段，使用DateTime类型，默认值为数据库服务器的当前时间
    create_time: Mapped[datetime] = mapped_column(
        DateTime, 
        server_default=func.now(), 
        comment="创建时间"
    )
    
    # 修改时间字段，使用DateTime类型，默认值为数据库服务器的当前时间
    # 当记录更新时自动更新为当前时间
    modify_time: Mapped[datetime] = mapped_column(
        DateTime, 
        server_default=func.now(), 
        onupdate=func.now(), 
        comment="修改时间"
    )
    
    # 数据状态字段，使用Integer类型，默认值为1
    # 1-新增; 2-修改; 3-删除
    datastatus: Mapped[int] = mapped_column(
        Integer, 
        default=1, 
        comment="数据状态:1-新增;2-修改;3-删除"
    )

    @classmethod
    def get_column_attrs(cls) -> list:
        """
        获取模型的所有列属性名称列表
        返回: list: 包含所有列属性名称的列表
        """
        # 使用inspect获取模型的映射器
        mapper = inspect(cls)
        # 返回所有列属性的键名
        return mapper.column_attrs.keys()
    
    @classmethod
    def get_attrs(cls) -> list:
        """
        获取模型的所有属性名称列表（包括列属性和其他属性）
        
        返回:
            list: 包含所有属性名称的列表
        """
        mapper = inspect(cls)
        # 返回所有属性的键名
        return mapper.attrs.keys()
    
    @classmethod
    def get_relationships_attrs(cls) -> list:
        """
        获取模型的所有关系属性名称列表
        
        返回:
            list: 包含所有关系属性名称的列表
        """
        mapper = inspect(cls)
        # 返回所有关系属性的键名
        return mapper.relationships.keys()    